/**
 * @(#)${NAME}.java Mar 7, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: Mar 7, 2007 - 4:32:24 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Mar 7, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.seguridad;

import com.psiqueware.alheli.basico.BaseObjectInterface;

import java.util.ArrayList;
import java.util.List;

/**
 * Tipo de Permiso para el {@link Permiso}  dado.
 * <br/>Paquete Original: com.psiqueware.basico.seguridad
 * <br/>Nombre  Original: ${NAME}
 * <br/>Oprima para ver : <a href="${NAME}.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a>
 * @version Revision: 1.1 Mar 7, 2007 4:32:24 PM
 * @noinspection StaticVariableOfConcreteClass, StaticVariableNamingConvention, ClassWithoutNoArgConstructor, ClassWithoutLogger, ValueOfIncrementOrDecrementUsed, NonFinalStaticVariableUsedInClassInitialization, MethodReturnOfConcreteClass, EnumeratedConstantNamingConvention, MagicNumber
 */
public enum TipoPermiso implements BaseObjectInterface<TipoPermiso>
{

    ACTIVIDAD(1L, "TipoPermiso.ACTIVIDAD"),
    AGRUPACION(2L, "TipoPermiso.AGRUPACION"),
    ALTAS(3L, "TipoPermiso.ALTAS"),
    CAMBIOS(4L, "TipoPermiso.CAMBIOS"),
    BAJAS(5L, "TipoPermiso.BAJAS"),
    PROPIEDAD(6L, "TipoPermiso.PROPIEDAD");


    /**
     * Nombre de este TipoPermiso.
     */
    private String m_nombre;

    /**
     * Identificador &uacute;nico de esta TipoPermiso.
     * Se utiliza de tipo Long para poder portar esta clase facilmente a un cat&aacute;logo.
     */
    private Long m_id;


    /**
     * Construye un TipoPermiso a partir de un nombre y un id.
     * <p>Es una enumeraci&oacute;n por lo tanto el constructor es privado.</p>
     *
     * @param id
     * @param name
     */
    private TipoPermiso(Long id, String name)
    {
        m_nombre = name;
        this.m_id = id;
    }

    /**
     * Convierte este {@link TipoPermiso} a su representaci&oacute;n textual.
     *
     * @noinspection DuplicateStringLiteralInspection, HardCodedStringLiteral
     */
    public String toString()
    {

        StringBuffer sb = new StringBuffer();
        sb.append("<Instance Class = '").append(this.getClass()).append("'>");
        sb.append("<id>").append(m_id).append("</id>");
        sb.append("<nombre>").append(m_nombre).append("</nombre>");
        sb.append("</Instance>");
        return sb.toString();
    }

    /**
     * Devuelve el identificador textual de este TipoPermiso.
     *
     * @return String con el nombre.
     */
    public String getNombre()
    {
        return m_nombre;
    }


    /**
     * Devuelve el identificador &uacute;nico de este TipoPermiso.
     *
     * @return Long con el id.
     */
    public Long getId()
    {
        return m_id;
    }

    /**
     * Devuelve un {@link List} con los {@link TipoPermiso} de esta enumeraci&oacute;n.
     */
    private static List<TipoPermiso> m_objects = null;

    /**
     * Devuelve una lista con todos los {@link TipoPermiso} de la enumeraci&oacute;n.
     *
     * @return nueva List de {@link TipoPermiso};
     *
     * @noinspection ReturnOfCollectionOrArrayField
     */
    public static List<TipoPermiso> listTipoPermiso()
    {
        if (null == m_objects)
        {
            generaListTipoPermiso();
        }
        return m_objects;
    }

    /**
     * Genera una lista con todos los {@link TipoPermiso} de la enumeraci&oacute;n.
     *
     * @return nueva List de {@link TipoPermiso};
     */
    private static synchronized List<TipoPermiso> generaListTipoPermiso()
    {
        if (null == m_objects)
        {
            m_objects = new ArrayList<TipoPermiso>();
            m_objects.add(ACTIVIDAD);
            m_objects.add(AGRUPACION);
            m_objects.add(ALTAS);
            m_objects.add(BAJAS);
            m_objects.add(PROPIEDAD);
        }
        return m_objects;
    }


    /**
     * Devuelve el TipoPermiso al que corresponde este id.
     *
     * @param id del TipoPermiso buscado.
     *
     * @return {@link TipoPermiso}.
     */
    public static TipoPermiso desdeId(Long id)
    {
        TipoPermiso salida = null;
        for (TipoPermiso obj : listTipoPermiso())
        {
            if (obj.getId().equals(id))
            {
                salida = obj;
                break;
            }
        }
        return salida;
    }

    /**
     * Devuelve el TipoPermiso al que corresponde este nombre.
     *
     * @param nombre del TipoPermiso buscado.
     *
     * @return {@link TipoPermiso}.
     *
     * @noinspection CallToStringEquals
     */
    public static TipoPermiso desdeNombre(String nombre)
    {
        TipoPermiso salida = null;
        for (TipoPermiso obj : listTipoPermiso())
        {
            if (obj.getNombre().equals(nombre))
            {
                salida = obj;
                break;
            }
        }
        return salida;
    }

}
